package zhoug.common.json;

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;

import java.io.Reader;
import java.util.ArrayList;
import java.util.List;

/**
 * Gson 序列化工具封装
 *
 * @Author: zhoug
 * @Date: 2024-12-10
 * @Description:
 */
public class GsonUtils {
    private final Gson mGson;


    public static GsonUtils with(Gson gson) {
        return new GsonUtils(gson);
    }

    public static GsonUtils getDefault() {
        return new GsonUtils(null);
    }

    protected GsonUtils(Gson gson) {
        this.mGson = gson != null ? gson : creatGson();
    }

    private static Gson creatGson() {
        // 解决disableHtmlEscaping ”=”转化成”\u003d”的问题
        return new Gson().newBuilder().disableHtmlEscaping().create();
    }


    /**
     * 对象序列化为json字符串
     *
     * @param obj
     * @return
     */
    public String toJson(Object obj) {
        if (obj == null) return null;
        return mGson.toJson(obj);
    }


    /**
     * json字符串反序列化为对象
     *
     * @param json
     * @param cls
     * @param <T>
     * @return
     */
    public <T> T fromJson(String json, Class<T> cls) {
        if (json == null) {
            return null;
        }
        return mGson.fromJson(json, cls);
    }


    /**
     * json字符串反序列化为对象列表
     *
     * @param json
     * @param typeToken
     * @param <T>
     * @return
     */
    public <T> List<T> fromJsonList(String json, TypeToken<List<T>> typeToken) {
        if (json == null) {
            return null;
        }
        return mGson.fromJson(json, typeToken.getType());
    }

    /**
     * json字符串反序列化为对象列表
     *
     * @param json
     * @param typeToken
     * @param <T>
     * @return
     */
    public <T> ArrayList<T> fromJsonArrayList(String json, TypeToken<ArrayList<T>> typeToken) {
        if (json == null) {
            return null;
        }
        return mGson.fromJson(json, typeToken.getType());
    }


    /**
     * 使用字符串创建json对象
     *
     * @param json
     * @return
     */
    public static JsonElement createJsonElement(String json) {
        return new JsonParser().parse(json);
    }

    /**
     * 使用字符串创建json对象
     *
     * @param reader
     * @return
     */
    public static JsonElement createJsonElement(Reader reader) {
        return new JsonParser().parse(reader);
    }

    /**
     * 使用字符串创建json对象
     *
     * @param jsonReader
     * @return
     */
    public static JsonElement createJsonElement(JsonReader jsonReader) {
        return new JsonParser().parse(jsonReader);
    }

    /**
     * 用来判断json为null
     *
     * @param jsonElement
     * @return
     */
    public static boolean isNonNull(JsonElement jsonElement) {
        return jsonElement != null && !jsonElement.isJsonNull();
    }

    public static JsonElement get(JsonObject jsonObject, String key) {
        if (jsonObject != null) {
            JsonElement jsonElement = jsonObject.get(key);
            if (GsonUtils.isNonNull(jsonElement)) {
                return jsonElement;
            }
        }
        return null;
    }

    /**
     * 复制
     *
     * @param src
     * @param <T>
     * @return
     * @noinspection unchecked
     */
    public <T> T copy(T src) {
        if (src == null) return null;
        return (T) fromJson(toJson(src), src.getClass());
    }

    /**
     * 复制
     *
     * @param src
     * @param <T>
     * @return
     * @noinspection unchecked
     */
    public <T> List<T> copyList(List<T> src, TypeToken<List<T>> typeToken) {
        if (src == null) return null;
        return fromJsonList(toJson(src), typeToken);
    }

    /**
     * 复制
     *
     * @param src
     * @param <T>
     * @return
     * @noinspection unchecked
     */
    public <T> ArrayList<T> copyArrayList(List<T> src, TypeToken<ArrayList<T>> typeToken) {
        if (src == null) return null;
        return fromJsonArrayList(toJson(src), typeToken);
    }


}
